﻿// 4927. 河流跳房子.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>



using  namespace std;
/*
https://www.acwing.com/problem/content/4930/
每年奶牛们都会在一条笔直的河流上举办跳房子比赛。

比赛起点是一块岩石，终点是另一块岩石。

起点岩石和终点岩石之间的距离为 L。

在起点和终点之间，有 N块岩石（不含起点和终点的岩石）。

每块岩石与起点岩石之间的距离为 Di。

在比赛过程中，奶牛们将从起点岩石出发，在岩石之间跳跃，直至到达终点岩石。

为了提高比赛难度，约翰计划移除一些岩石，使得相距最近的两块岩石之间的距离尽可能大。

已知，约翰无法移除起点岩石和终点岩石，并且他最多只能移除 M块岩石。

请你计算，移除岩石后，相距最近的两块岩石之间的距离的最大可能值。

输入格式
第一行包含三个整数 L,N,M。

接下来 N行，每行包含一个整数 Di。

岩石位置两两不同。

输出格式
一个整数，表示相距最近的两块岩石之间的距离的最大可能值。

数据范围
0≤M≤N≤50000,
1≤L≤109,
0<Di<L
输入样例：
25 5 2
2
14
11
21
17
输出样例：
4

65343245 0 0
65343245

10 1 1
6

10 0 0 


样例解释
在移动任何岩石之前，相距最近的两块岩石之间的距离为 2（起点岩石与第一块岩石之间的距离），
去掉距离起点距离为 2,14的岩石，可以使得相距最近的两块岩石之间的距离变为 4。
*/

const int N = 50010;
const int L = 1e9;
long long arr[N];
int l, n, m;

bool check(long long x) {
	long long curr = 0; int cnt = 0;
	
	for (int i = 1; i <= n+1; i++) {
		if (arr[i] - curr < x) {
			cnt++; 
		}
		else {
			curr = arr[i];
		}
	}

	if (cnt <= m) {
		return true;
	}

	return false;
}


void solve() {
	//if (n == 0) {cout << l << endl;return;}

	long long ll = 0; long long rr = l + 10;
	while (ll < rr) {
		long long mid = ( ll + rr+1) >> 1;
		if (check(mid)) {
			ll = mid;
		}
		else {
			rr = mid - 1;
		}
	}

	cout << ll << endl;

}

int main()
{
	cin >> l >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
	}
	arr[0] = 0; arr[n + 1] = l;
	sort(arr,arr+1+n);
	solve();

	return 0;
}

 